package com.tfswx.jcyw.sqlmodel.api.bean.table.expression;

import com.tfswx.jcyw.sqlmodel.api.bean.jdpz.BdsItem;
import com.tfswx.jcyw.sqlmodel.api.bean.table.Expression;
import lombok.Data;

import java.util.ArrayList;
import java.util.List;

/**
 * @author 张述江
 * @date 2023/9/15
 */
@Data
public class WhereItem implements Expression {
    private List<Expression> whereItemList = new ArrayList<>();

    private List<String> typeList = new ArrayList<>();

    public WhereItem() {
    }

    public WhereItem(Expression whereItem) {
        whereItemList.add(whereItem);
    }

    public static WhereItem parse(List<BdsItem> bdsList) {
        WhereItem whereItem = new WhereItem();
        for (int i = 0; i < bdsList.size(); i++) {
            BdsItem bdsItem = bdsList.get(i);
            Expression expr = new Column(bdsItem.toString());
            if (i == 0) {
                whereItem.andWhere(new WhereItem(expr));
            } else {
                BdsItem preBds = bdsList.get(i - 1);
                whereItem.addWhere(preBds.getYxygbdsljf(), new WhereItem(expr));
            }
        }
        return whereItem;
    }

    public void andWhere(Expression whereItem) {
        if (!whereItemList.isEmpty()) {
            typeList.add("AND");
        }
        whereItemList.add(whereItem);
    }

    public void orWhere(Expression whereItem) {
        if (!whereItemList.isEmpty()) {
            typeList.add("OR");
        }
        whereItemList.add(whereItem);
    }

    public void addWhere(String type, Expression whereItem) {
        if (!whereItemList.isEmpty()) {
            typeList.add(type.toUpperCase());
        }
        whereItemList.add(whereItem);
    }

    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        int size = whereItemList.size();
        for (int i = 0; i < size; i++) {
            if (i > 0) {
                builder.append(" ").append(typeList.get(i - 1)).append(" ");
            }
            builder.append(whereItemList.get(i));
        }
        return builder.toString();
    }
}
